import re
import random

from rest_framework.response import Response
from rest_framework.views import APIView

from user import userser, models
from user.models import UserModel
from utils.myjwt import jwtweb


# Create your views here.
# 注册的视图 添加到数据库里
class RegisterView(APIView):
    def post(self, request):
        data = {}
        account = request.data.get('account')        # 账号
        password = request.data.get('password')
        # 1
        if account == "" or password == "":              # 如果账号或者密码为空或 返回错误信息 结束
            return Response({'code':400,"message":"账号或者密码不能为空"})

        #2
        email_pattern =r"^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$"   # 邮箱的正则
        if re.match(email_pattern, account):            # 如果邮箱 正确
            data['email'] = account
        elif re.match(r"^1[3-9]\d{9}$", account):        #     或者手机号匹配
            # 手机号唯一
            user =UserModel.objects.all()
            ser1 =userser.UserSerializer(user,many=True)
            for i in ser1.data:
                if i["phone"]==account:
                    return Response({"msg":"手机号不能重复"})
            data['phone'] = account
        else:  # 任选一个 匹配 #     或者用户名匹配
            data['username']=account

        data['password'] = password   #     输入密码
        ser =userser.UserSerializer(data=data)
        # 3
        if ser.is_valid():
            ser.save()
            return Response({"msg":"注册成功"})
        return Response({"msg":ser.errors})

# 登录的视图
class LoginByAccount(APIView):
    def post(self, request):
        account = request.data.get('account')#获取前端传来的 账户信息
        password = request.data.get('password')#获取密码信息
        email_pattern = r"^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$"
        if re.match(email_pattern, account):             # 如果邮箱 格式
            usermodel =UserModel.objects.filter(email=account)#从数据库获取账号-->是邮箱的对应的用户信息  前端传来的和数据库的一样
        elif re.match(r"^1[3-9]\d{9}$", account):# 或者是手机号格式
            usermodel =UserModel.objects.filter(phone=account)#从数据库获取账号-->是手机号的对应的用户信息
        else :                                           # 或者是用户名格式
            usermodel =UserModel.objects.filter(username=account)#从数据库获取账号-->是用户名的对应的用户信息
        if usermodel:   # 如果存在并正确
            # 判断密码
            if usermodel[0].password == password:
                # print(usermodel,111111)     <QuerySet [<UserModel: >, <UserModel: >, <UserModel: >, <UserModel: >]> 111111

                # 通过MyJwt类  def gettoken(self,userid,account) 方法进行编码
                token=jwtweb.gettoken(usermodel[0].id,account)
                # print(token)
                return Response({"msg":"登陆成功","token":token,"id":usermodel[0].id,"code":201})
            # 密码错误
            else:
                return Response({"msg":"密码错误","code":402})
        # 否则错误
        else:
            return Response({"msg":"账号不存在","code":402})
from utils.myredis import redistoll
# 短信验证码登录
class LoginByCode(APIView):
    def post(self, request):
        #如果手机号存在就是登录，不存在就是注册，添加记录到数据库同时设置初始密码为000000


        account = request.data.get('account') #获取手机号 账号
        code = request.data.get('code') #获取验证码 先判断验证码是否正确
        # 如果redis中 account 的值不等于code，，，用到了redist 通过键找值，键的字段是account
        print(account)
        print(code)
        # 二、、获取redis中存的验证码
        if redistoll.getstr(account)!=code:
            return Response({"msg":"验证码错误","code":402})
        else:
            #验证码正确
            userinfo =UserModel.objects.filter(phone=account)
            print(userinfo[0].phone)

            #存在账号
            if userinfo:
                token=jwtweb.gettoken(userinfo[0].id,account) #token 进行编码
                return Response({"msg":"登陆成功","token":token,"id":userinfo[0].id,"code":201})
            #不存在账号 在数据库新增一个手机号
            else:
                data ={"phone":account,"password":"000000"}
                # 像添加 往数据库加手机号 data 接收数据
                ser =userser.UserSerializer(data=data)
                if ser.is_valid():
                    ser.save()
                    token=jwtweb.gettoken(ser.data["id"],account)
                    return Response({"msg":"登录成功","token":token,"id":ser.data["id"],"code":201})
                else:
                    return Response({"msg":ser.errors,"code":402})


        # redistoll.setstr("logincode","123456")
        # redistoll.setex("logincode","123456",60)
        # return Response("ok")
        # return Response(redistoll.getstr("logincode"))

from utils.sendcode import send_message#导包
# 发送验证码
class SendCode(APIView):
    def post(self, request):
        phone = request.data.get('account')#1.获取到账户信息
        # 手机号验证校验
        ret=re.match(r"^1[3-9]\d{9}$",phone)
        if ret:
            code = str(random.randint(1000,9999))#2.随机生成一个验证码
            if send_message(phone,code):#调用验证码的函数 如果验证码正确

                # 一、、要先设置redis中的建和值传给 -->LoginByCode  APIView验证码登录
                redistoll.setex(phone,code,60*2)#存到redis并且设置失效时间
                return Response({"msg":"发送成功"})
            else:
                return Response({"msg":"发送失败"})
        else:
            return Response({"msg":"手机号格式不正确"})


